// 直接给exports赋值导致内存改变，那么exports所指的内存就是无效内存，所以会返回module.exports空对象
// exports = {name: '不吐不快'};
// module.exports = {name: '樱花树下'}
// exports.age = 18;
// module.exports.age = 18;
// module.exports = exports //就是重新把无效内存指向真正内存


// 实际上这两个对象指向同一块内存。这也就是说module.exports和exports是等价的
// 即 exports.age = 18; 和 module.exports.age = 18;是一样的
// 当重新赋值的话 比如 exports = {name: '不吐不快'}; 这个时候就相当于改变的内存地址了 但是每一个node模块都会默认返回一个module.exports
// 这个时候这两个地址就不等了 返回的其实还是默认的module.exports所以就访问不到内容
// 可以通过module.exports = exports方式对内存地址重新赋值

// 当使用require命令加载某个模块时，就会运行整个模块的代码
// 3.对于基本数据类型，属于复制。即会被模块缓存。同时，在另一个模块可以对该模块输出的变量重新赋值。
// 4.对于复杂数据类型，属于浅拷贝。由于两个模块引用的对象指向同一个内存空间，因此对该模块的值做修改时会影响另一个模块
let count = 0;
var add = function () {
    count++
}
var obj = {
    count:10,
    add(){
        obj.count++
    }
}
module.exports = {add,count,obj};
// 当外界改变count的时候这个里面的count不会改变
// 当外界改变obj.count的时候这个里面的obj.count的值会改变